home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 3 / Info_Mac_1994-01.iso / Development / Source / Mailcheck Source / drvr src / mmc_prep.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-06-15  |  6.1 KB  |  246 lines  |  [TEXT/KAHL]

  1. /*
  2.  * Routines to handle reading and writing the prep file
  3.  * and driver state
  4.  *
  5.  * by Aaron Wohl (aw0g+@andrew.cmu.edu) jul 1990
  6.  * Carnegie-Mellon University
  7.  * Special Projects
  8.  * Pittsburgh, PA 15213-3890
  9.  * (412)-268-5032
  10.  */
  11.  
  12. #include "mmc_core.h"
  13. #include "mmc_prep.h"
  14. #include "string.h"
  15. #include "mmc_os_preserve.h"
  16.  
  17. /*
  18.  * create the resource fork of a the Prep file
  19.  */
  20. LDEF(void make_pref(void))
  21. {
  22.     SysEnvRec info;
  23.     short int current_directory;
  24.     Str255 vol_name;
  25.     int err;
  26.     SysEnvirons(1, &info);
  27.     GetVol(vol_name,¤t_directory);
  28.     SetVol("\p",info.sysVRefNum);
  29.     Create(PREP_NAME,0,'MMCz','Prep');
  30.     CreateResFile(PREP_NAME);
  31.     SetVol("\p",current_directory);
  32. }
  33.  
  34. /*
  35.  * return the resource fork
  36.  * return a system error code < 0 if can't open fork
  37.  */
  38. LDEF(int find_res_file(unsigned char *name,int permission))
  39. {
  40.     int result;
  41.     int ref_num;
  42.     SysEnvRec info;
  43.     short int current_directory;
  44.     Str255 vol_name;
  45.     int err;
  46.     SysEnvirons(1, &info);
  47.     GetVol(vol_name,¤t_directory);
  48. #ifdef RUBBISH
  49.     result=HOpenRF(info.sysVRefNum,0L,name,permission,&ref_num);
  50.     if(result>=0)
  51.         result=ref_num;
  52. #endif
  53.     result=OpenRFPerm((void*)name,info.sysVRefNum,permission);
  54.     return result;
  55. }
  56.  
  57. /*
  58.  * get the state contained in the Prep file in the system folder
  59.  * returns < 0 on error (a system error code, or -1)
  60.  * returns 0 on success
  61.  */
  62. LDEF(long mmc_read_prep_internal(mmc_state_pt s))
  63. {
  64.   int old_res_file;
  65.   int err=0;
  66.   int prep_res;
  67.   mmc_state_pt **fhandle;
  68.   old_res_file=CurResFile();    /*remember so we can put current resource file back*/
  69.   prep_res=find_res_file(PREP_NAME,fsRdPerm); /*open the device driver resource file*/
  70.   if(prep_res < 0)        /*find the resource file?*/
  71.     return prep_res;
  72.   fhandle=(mmc_state_pt **)Get1Resource('Prep',PREP_RES_NUM);
  73.  if(fhandle==0)
  74.       err=ResError();
  75.   else
  76.       if(GetHandleSize((Handle)fhandle)!=sizeof(mmc_state))
  77.           err= -1;
  78.       else {
  79.           memcpy(s,*fhandle,sizeof(*s));
  80.           s->mmc_st&= ~MCS_unsaveable;        /*don't restore debug state, etc*/
  81.           if(s->mmc_st_maj_ver!=MMC_ST_maj_ver)
  82.             err= -1;
  83.           if(s->mmc_st_min_ver<MMC_ST_min_ver)
  84.             err= -1;
  85.           if(s->mmc_check_num!=MMC_check_num)
  86.             err= -1;
  87.       }
  88.   CloseResFile(prep_res);
  89.   UseResFile(old_res_file);    /*go back to the normal resource file*/
  90.   return err;
  91. }
  92.  
  93. int mmc_read_prep(mmc_state_pt s)
  94. {
  95.     return OSP_protected_call(OSP_same,mmc_read_prep_internal,s);
  96. }
  97.  
  98. LDEF(long mmc_write_prep_internal(mmc_state_pt s))
  99. {
  100.   int old_res_file;
  101.   int err=0;
  102.   int prep_res;
  103.   mmc_state_pt *fhandle;
  104.   old_res_file=CurResFile();    /*remember so we can put current resource file back*/
  105.   prep_res=find_res_file(PREP_NAME,fsRdWrPerm); /*open the device driver resource file*/
  106.   if(prep_res< 0) {
  107.     make_pref();
  108.     prep_res=find_res_file(PREP_NAME,fsRdWrPerm); /*open the device driver resource file*/
  109.   }
  110.   if(prep_res < 0)        /*find the resource file?*/
  111.     return prep_res;
  112.   UseResFile(prep_res);    /*may already be open, force to front*/
  113.   fhandle=(mmc_state_pt *)Get1Resource('Prep',PREP_RES_NUM);
  114.   if(fhandle==0) {
  115.     fhandle=(mmc_state_pt *)NewHandle(sizeof(*s));
  116.     if(fhandle!=0)
  117.       memcpy(*fhandle,s,sizeof(*s));
  118.     strcpy((*fhandle)->mmc_text_state,"SavedState");
  119.     AddResource((Handle)fhandle,'Prep',PREP_RES_NUM,"\p");
  120.     err=ResError();
  121.   } else {
  122.        if(GetHandleSize((Handle)fhandle)!=sizeof(mmc_state)) {
  123.            asm {
  124.                move.l fhandle,a0
  125.                move.w #sizeof(mmc_state),d0
  126.                _SetHandleSize
  127.                move.w d0,err
  128.            }
  129.        }
  130.        if(err==0) {
  131.          memcpy(*fhandle,s,sizeof(*s));
  132.          strcpy((*fhandle)->mmc_text_state,"SavedState");
  133.         ChangedResource((Handle)fhandle);
  134.          WriteResource((Handle)fhandle);
  135.      }
  136.   }
  137.   CloseResFile(prep_res);
  138.   UseResFile(old_res_file);    /*go back to the normal resource file*/
  139.   return err;
  140. }
  141.  
  142. int mmc_write_prep(mmc_state_pt s)
  143. {
  144.     return OSP_protected_call(OSP_same,mmc_write_prep_internal,s);
  145. }
  146.  
  147. LDEF(char *chooser_name(char *buf))
  148. {
  149.   unsigned char **handle;
  150.   int len;
  151.   handle=(unsigned char**)GetString(-16096);
  152.   len=GetHandleSize((Handle)handle);
  153.   if((handle==0)||(len<=1))
  154.    return "no-chooser-name";
  155.   if((**handle)>(len-1))
  156.    return "bad-chooser-name";
  157.   len=imin(MMC_uname_len-1,len);
  158.   len=imin(len,**handle);
  159.   if(len!=0)
  160.    memcpy(buf,(*handle)+1,len);
  161.   buf[len]=0;
  162.   return buf;
  163. }
  164.  
  165. int mmc_dont_like_prep(mmc_state_pt s)
  166. {
  167.   int result=((s->mmc_st_maj_ver!=MMC_ST_maj_ver)||
  168.      (s->mmc_st_min_ver!=MMC_ST_min_ver)||
  169.      (s->mmc_check_num!=MMC_check_num));
  170.   return result;
  171. }
  172.  
  173. void mmc_init_state(mmc_state_pt s)
  174. {
  175.   memset(s,0,sizeof(*s));
  176.   s->mmc_st_maj_ver=MMC_ST_maj_ver;
  177.   s->mmc_st_min_ver=MMC_ST_min_ver;
  178.   s->mmc_check_num=MMC_check_num;
  179. }
  180.  
  181. void mmc_invent_state(mmc_state_pt s)
  182. {
  183.   char buf[256];
  184.   mmc_init_state(s);
  185.   s->mmc_remind_time=DEFAULT_REMIND_TIME;
  186.   s->mmc_sound_id=DEFAULT_SOUND_ID;
  187.   TURN_ON_FLAGS(*s,MCS_want_open|MCS_hearmm|MCS_nsound|MCS_nblink|MCS_npost);
  188.   strcpy(s->mmc_uname,chooser_name(buf));
  189.   strcpy(s->mmc_text_state,"Default configuration used");
  190. }
  191.  
  192. int mmc_get_drvr_state(int refnum,mmc_state_pt s)
  193. {
  194.   int err;
  195.   mmc_io_record ios;
  196.   INIT_CPB(ios,refnum,MMC_get_state);
  197.   ios.iostate.mmc_st_maj_ver=MMC_ST_maj_ver;
  198.   ios.iostate.mmc_st_min_ver=MMC_ST_min_ver;
  199.   err=PBControl((void*)&ios,FALSE);
  200.   *s=ios.iostate;
  201.   return err;
  202. }
  203.  
  204. sound_res_state mmc_use_sound_res(void)
  205. {
  206.     sound_res_state sstate;
  207.     sstate.prev_res=CurResFile();
  208.       sstate.sound_res=find_res_file("\pMailCheck Sounds",fsRdPerm);
  209.       if(sstate.sound_res>0)
  210.         UseResFile(sstate.sound_res);
  211.       return sstate;
  212. }
  213.  
  214. void mmc_close_sound_res(sound_res_state sstate)
  215. {
  216.      if(sstate.sound_res>0)
  217.       CloseResFile(sstate.sound_res);
  218.     UseResFile(sstate.prev_res);
  219. }
  220.  
  221. /*
  222.  * set driver state where the sound has possibly changed
  223.  */
  224. int mmc_set_drvr_state_sound_yes(int refnum,mmc_state_pt s,int iokind)
  225. {
  226.   sound_res_state cur_res=mmc_use_sound_res();
  227.   int err=mmc_set_drvr_state_sound_no(refnum,s,iokind);
  228.   mmc_close_sound_res(cur_res);
  229.   return err;
  230. }
  231.  
  232. /*
  233.  * set driver state where the sound has not changed
  234.  */
  235. int mmc_set_drvr_state_sound_no(int refnum,mmc_state_pt s,int iokind)
  236. {
  237.   int err;
  238.   mmc_io_record ios;
  239.   ios.iostate=*s;
  240.   INIT_CPB(ios,refnum,iokind);
  241.   err=PBControl((void*)&ios,FALSE);
  242.   *s=ios.iostate;
  243.   return err;
  244. }
  245.  
  246.